package com.dollar.ruyuan_juc.deadLock;

/**
 * 死锁的发生也必须具备一定的条件，死锁的发生必须具备以下四个必要条件：
 * <p>
 * 互斥，共享资源 X 和 Y 只能被一个线程占用；
 * 占有且等待，线程01 已经取得共享资源 X，在等待共享资源 Y 的时候，不释放共享资源 X；
 * 不可抢占，其他线程不能强行抢占线程01 占有的资源；
 * 循环等待，线程01 等待线程02 占有的资源，线程02 等待线程01 占有的资源，就是循环等待。
 * <p>
 * 如何避免死锁发生呢？
 * <p>
 * 首先，“互斥”是没有办法避免的，对于“占用且等待”这个条件，我们可以一次性申请所有的资源，这样就不存在等待了。
 * 对于“不可抢占”这个条件，占用部分资源的线程进一步申请其他资源时，如果申请不到，可以在一定时间后，
 * 主动释放它占有的资源，这样就解决了不可抢占这个条件。
 * <p>
 * 对于“循环等待”，我们可以靠按“次序”申请资源来预防。所谓按序申请，就是给资源设定顺序，
 * 申请的时候可以先申请序号小的资源，再申请序号大的，这样资源线性化后，自然就不存在循环等待了。
 * <p>
 * 我们已经从理论上解决了如何避免死锁，那我们从代码上举几个例子来实践下这些理论。
 */
public class DeadLock {
    public static String obj1 = "obj1";
    public static String obj2 = "obj2";


    public static void main(String[] args) {
        Thread a = new Thread(new Lock1());
        Thread b = new Thread(new Lock2());
        a.start();
        b.start();
    }
}
